import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Calendar;
import java.util.Properties;
import java.util.TimeZone;

import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class EagleEyeAlarma {

	public static void generarAlarma(String mensaje) {
		// toma el mensaje en formato LLLLLLLLLLLLLLLLLLLLAAAABBCCXXXXXXXXXX
		final String timestamp = mensaje.substring(0, 20);
		final String codigoCasa = mensaje.substring(20, 24);
		final String tipoEvento = mensaje.substring(24, 26);
		final String numeroPersonas = mensaje.substring(26, 28);
		final String infoAdicional = mensaje.substring(28, mensaje.length());

		Informador informador = new InformadorSocket();
		informador.enviarMensaje(codigoCasa, tipoEvento, numeroPersonas,
				infoAdicional, timestamp);
		/**
		 * Se devuelve el control del flujo al servidor de alamr mientras el
		 * hilo envia el correo electronico
		 */
		Runnable lanzadorCorreo = new Runnable() {
			public void run() {
				Informador informadorCorreo = new InformadorCorreo();
				informadorCorreo.enviarMensaje(codigoCasa, tipoEvento,
						numeroPersonas, infoAdicional, timestamp);

			}

		};
		Thread hiloCorreo = new Thread(lanzadorCorreo);
		hiloCorreo.start();

		RegistradorEvento evento = new RegistradorEventoMsyql();
		evento.registrarEvento(mensaje);

	}
}

interface Informador {
	public boolean enviarMensaje(String codigoCasa, String tipoEvento,
			String numeroPersonas, String infoAdicional, String timestamp);
}

class InformadorCorreo implements Informador {

	// enviar sto a traves de SMTP
	@Override
	public boolean enviarMensaje(String codigoCasa, String tipoEvento,
			String numeroPersonas, String infoAdicional, String timestamp) {
		boolean enviado = false;

		Properties props = new Properties();
		props.put("mail.smtp.host", "smtp.gmail.com");
		props.put("mail.smtp.auth", "true");
		props.put("mail.smtp.port", "465");
		props.put("mail.smtp.socketFactory.port", "465");
		props.put("mail.smtp.socketFactory.fallback", "fale");
		props.put("mail.smtp.socketFactory.class",
				"javax.net.ssl.SSLSocketFactory");
		props.put("mail.smtp.starttls.enable", "true");

		Authenticator auth = new Authenticator() {
			public PasswordAuthentication getPasswordAuthentication() {
				return new PasswordAuthentication("ojato19@gmail.com",
						"A1983624");
			}
		};

		Session mailSession = Session.getDefaultInstance(props, auth);
		mailSession.setDebug(true);

		MimeMessage m = new MimeMessage(mailSession);
		try {
			m.setFrom(new InternetAddress("ojato19@gmail.com"));
			// m.setSubject("ALARMA TIPO "+tipoEvento);
			// Set TO:
			InternetAddress a[] = new InternetAddress[1];
			a[0] = new InternetAddress("ojato19@gmail.com");
			// a[1] = new InternetAddress("oscar.melo@assenda.com");

			m.setRecipients(Message.RecipientType.TO, a);

			// Set content
			String data = "Se genero la alarma con la siguiente informacion:<br>";
			data += "Direccion: " + codigoCasa + "<br>";
			data += "Numero de personas: " + numeroPersonas + "<br>";
			data += "Informacion complementaria: " + infoAdicional + "<br>";
			data += "Enviado a las : "
					+ Calendar
							.getInstance(TimeZone.getTimeZone("America/Lima"))
							.getTime() + "<br>";
			m.setContent(data, "text/html");
			// Send message
			Transport.send(m);
			enviado = true;
		} catch (AddressException e) {
			e.printStackTrace();
		} catch (MessagingException e) {
			e.printStackTrace();
		}
		return enviado;

	}

}

class InformadorSocket implements Informador {

	@Override
	public boolean enviarMensaje(String codigoCasa, String tipoEvento,
			String numeroPersonas, String infoAdicional, String timestamp) {
		long time = Long.parseLong(timestamp);

		String data = "";
		String fecha = String.format("lll",
				Calendar.getInstance(TimeZone.getTimeZone("America/Lima")));

		data += "Direccion: " + codigoCasa + "\n";
		data += "Numero de personas: " + numeroPersonas + "\n";
		data += "Informacion complementaria: " + infoAdicional + "\n";
		data += "Enviado a las : " + fecha + "\n";
		data += "Enviado por hilo: " + Thread.currentThread().getName();

		Socket echoSocket = null;
		PrintWriter out = null;

		try {
			echoSocket = new Socket("127.0.0.1", 15400);
			out = new PrintWriter(echoSocket.getOutputStream(), true);

			out.println(new Long(time).toString());
			out.close();

			echoSocket.close();
		} catch (UnknownHostException e) {
			System.err.println("Don't know about host: taranis."
					+ e.getMessage());
			System.exit(1);
		} catch (IOException e) {
			System.err.println("Couldn't get I/O for "
					+ "the connection to: taranis." + e.getMessage());
			System.exit(1);
		}

		return false;
	}

}